package services;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import daoHibernate.FornecedorHibernateDao;
import daoHibernate.PedidoHibernateDao;
import daoHibernate.StatusHibernateDAO;
import entidades.Avaliacao;
import entidades.Pedido;
import entidades.Status;
import entidades.TipoUsuario;
import entidades.Usuario;
import flex.messaging.FlexContext;

public class PedidoService {

	public List<Pedido> listPedido(Long numPedido, long idStatus, Date dtPlanejadaDe, Date dtPlanejadaAte,
			 Date dtCriacaoIni, Date dtCriacaoFim, Long solicitacao, Long forn) {
		
		Status status = null;		
		
		boolean comprador = false, aprovador = false, fornecedor = false;
		
		if(idStatus != -1){
			StatusHibernateDAO sDao = new StatusHibernateDAO();
			
			status = sDao.searchStatus(idStatus);
		}		
		
		PedidoHibernateDao pedDao = new PedidoHibernateDao();	
		
		Usuario usuario = new UsuarioService().verificarUsuarioLogado();
		
		for(TipoUsuario tpu : usuario.getTiposUsuario()){
			if(tpu.getIdTipoUsuario() == 3){
				comprador = true;
			}else if(tpu.getIdTipoUsuario() == 4){
								
				if(usuario.getAprovaCompraAte() == 0){
					aprovador = false;
				}else{
					aprovador = true;
				}
				
			}else if(tpu.getIdTipoUsuario() == 5){
				
				fornecedor = true;
			}
		}		
		
		List<Pedido> peds = pedDao.searchPedidoList(numPedido, status, dtPlanejadaDe, dtPlanejadaAte, dtCriacaoIni, dtCriacaoFim, solicitacao, forn);
		
		
		List<Pedido> nova = new ArrayList<Pedido>();			
		
		boolean teste = true, valida = false;
		for (Pedido pedido : peds) {
			
			if(aprovador){
				if(pedido.getValorTotal() <= usuario.getAprovaCompraAte()){
					valida = true;
				}
			}else if(fornecedor){
				if(usuario.getFornecedor().getIdFornecedor().equals(pedido.getCotacao().getFornecedor().getIdFornecedor())){
					valida   = true;
				}
			}else{
				valida = true;
			}
			
			teste = true;
			for (Pedido pedido2 : nova) {
				if (pedido.getNumeroPedido() == pedido2
						.getNumeroPedido()) {
					teste = false;
				}
			}
			
			if (teste && valida) {
				nova.add(pedido);
			}

		}

		
		if (idStatus != -1) {
			peds = new ArrayList<Pedido>();

			for (Pedido pedido1 : nova) {
				
				if (pedido1.getStatus().getIdStatus().equals(idStatus)) {
					peds.add(pedido1);
				}
			}

			nova = peds;
		}

		
		return nova;
	}
	
	/**
	 * Grava pedido na sessao para Exibir Pedido
	 * @return
	 */
	public void setRecuperarPed(Pedido pedido){		
			
			FlexContext.getFlexSession().setAttribute("recuperarPedido", pedido);				
	}
	
	/**
	 * Recupera pedido da sessao para Exibir Pedido
	 * @return
	 */
	public Pedido recuperarPed(){		
			Pedido pedido = (Pedido) FlexContext.getFlexSession()
					.getAttribute("recuperarPedido");
//			FlexContext.getFlexSession().setAttribute("recuperarPedido", null);
			
			return pedido;
		
	}
	/**
	 * Aprovar pedido 
	 * @return
	 */
	public boolean aprovarPedido(){
		
		Pedido pedido = (Pedido) FlexContext.getFlexSession()
				.getAttribute("recuperarPedido");
		
		pedido.setAprovadoPor(new UsuarioService().verificarUsuarioLogado());
		pedido.setDataAprovacao(new Date());
		
		pedido.setStatus(new StatusHibernateDAO().searchStatus(8L));					
		
		return new PedidoHibernateDao().save(pedido);
	}
	
	/**
	 * Reprovar pedido 
	 * @return
	 */
	public boolean reprovarPedido(){
		
		Pedido pedido = (Pedido) FlexContext.getFlexSession()
				.getAttribute("recuperarPedido");
		
		pedido.setAprovadoPor(new UsuarioService().verificarUsuarioLogado());
		pedido.setDataAprovacao(new Date());
		
		pedido.setStatus(new StatusHibernateDAO().searchStatus(9L));					
		
		return new PedidoHibernateDao().save(pedido);
	}
	
	public boolean buscaAvaliacao(Pedido pedido){
		
		
		return new FornecedorHibernateDao().buscarAvaliacao(pedido);
	}
	
}